package com.punch.system.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.punch.common.dto.system.ModuleDTO;
import com.punch.common.exception.BusinessException;
import com.punch.common.page.PageInfo;
import com.punch.common.query.syste.ModuleQueryInfo;
import com.punch.common.simple.redis.utils.UserUtil;
import com.punch.common.tools.BasePage;
import com.punch.common.utils.ImageUtil;
import com.punch.common.vo.common.OptionVO;
import com.punch.common.vo.system.ModuleVO;
import com.punch.system.exception.SysExceptionEnum;
import com.punch.system.mapper.SysModuleMapper;
import com.punch.system.model.SysModule;
import com.punch.system.service.ModuleService;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * <p>
 * 功能模块表 服务实现类
 * </p>
 *
 * @author wjj
 * @since 2020-12-14
 */
@Service
public class ModuleServiceImpl extends ServiceImpl<SysModuleMapper, SysModule> implements ModuleService {

    /**
     * 模块列表
     *
     * @param queryInfo 查询条件
     * @return PageInfo<BannerVO>
     */
    @Override
    public PageInfo<ModuleVO> listModule(ModuleQueryInfo queryInfo) {
        queryInfo.setSortStr("sort_by:asc");
        return BasePage.queryBasePage(queryInfo, params -> getBaseMapper().queryCount(params),
                params -> {
                    List<ModuleVO> retList = getBaseMapper().queryList(params);
                    retList.forEach(moduleVO -> {
                        if (moduleVO.getStatus() == 0) {
                            moduleVO.setUpdateTime(null);
                        }
                    });
                    return retList;
                });
    }

    /**
     * 保存功能模块
     *
     * @param moduleDTO 提交表单
     * @return id
     */
    @Override
    public Integer saveModule(ModuleDTO moduleDTO) {
        SysModule sysModule = new SysModule();
        BeanUtil.copyProperties(moduleDTO, sysModule);
        sysModule.setCreateId(UserUtil.getLoginUserId());
        //处理活动图片前缀
        if (StrUtil.isNotEmpty(moduleDTO.getModuleImg())) {
            String img = ImageUtil.removePrefix(moduleDTO.getModuleImg());
            sysModule.setModuleImg(img);
        }
        if (!save(sysModule)) {
            throw new BusinessException(SysExceptionEnum.DATA_INSERT_EXCEPTION);
        }
        return sysModule.getId();
    }

    /**
     * 修改功能模块
     *
     * @param moduleDTO 提交表单
     * @return id
     */
    @Override
    public Integer updateModule(ModuleDTO moduleDTO) {
        SysModule sysModule = new SysModule();
        BeanUtil.copyProperties(moduleDTO, sysModule);
        sysModule.setId(moduleDTO.getModuleId());
        if (StrUtil.isNotEmpty(moduleDTO.getModuleImg())) {
            String img = ImageUtil.removePrefix(moduleDTO.getModuleImg());
            sysModule.setModuleImg(img);
        }
        if (!updateById(sysModule)) {
            throw new BusinessException(SysExceptionEnum.DATA_UPDATE_EXCEPTION);
        }
        return sysModule.getId();
    }

    /**
     * 功能模块详情
     *
     * @param moduleId 模块id
     * @return ModuleVO
     */
    @Override
    public ModuleVO getModule(Integer moduleId) {
        SysModule sysModuleEX = getById(moduleId);
        Optional.ofNullable(sysModuleEX).orElseThrow(() -> new BusinessException(SysExceptionEnum.DATA_NOT_EXIST));
        ModuleVO moduleVO = new ModuleVO();
        BeanUtil.copyProperties(sysModuleEX, moduleVO);
        if (StrUtil.isNotEmpty(sysModuleEX.getModuleImg())) {
            moduleVO.setModuleImg(ImageUtil.addPrefix(sysModuleEX.getModuleImg()));
        }
        moduleVO.setModuleId(moduleId);
        return moduleVO;
    }

    /**
     * 删除功能模块
     *
     * @param moduleId 模块id
     * @return id
     */
    @Override
    public Integer deleteModule(Integer moduleId) {
        SysModule sysModuleEX = getById(moduleId);
        Optional.ofNullable(sysModuleEX).orElseThrow(() -> new BusinessException(SysExceptionEnum.DATA_NOT_EXIST));
        //已经展示的不能删除,需要下架
        if (sysModuleEX.getStatus() == 1) {
            throw new BusinessException(SysExceptionEnum.STATUS_ERROR);
        }
        if (!removeById(moduleId)) {
            throw new BusinessException(SysExceptionEnum.DATA_DELETION_EXCEPTION);
        }
        return moduleId;
    }

    /**
     * 修改模块状态
     *
     * @param moduleId 模块id
     * @param status   状态 0-不显示 1-显示
     * @return moduleId
     */
    @Override
    public Integer updateModuleStatus(Integer moduleId, Integer status) {
        SysModule sysModuleEX = getById(moduleId);
        Optional.ofNullable(sysModuleEX).orElseThrow(() -> new BusinessException(SysExceptionEnum.DATA_NOT_EXIST));
        if (sysModuleEX.getStatus().equals(status)) {
            throw new BusinessException(SysExceptionEnum.STATUS_ERROR);
        }
        SysModule sysModule = new SysModule();
        sysModule.setStatus(status);
        sysModule.setId(moduleId);
        if (!updateById(sysModule)) {
            throw new BusinessException(SysExceptionEnum.DATA_UPDATE_EXCEPTION);
        }
        return moduleId;
    }

    /**
     * 简单模块列表
     *
     * @param type 类型
     * @return List<OptionVO>
     */
    @Override
    public List<OptionVO<Integer>> listSimpleModule(Integer type) {
        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<>();
        List<OptionVO<Integer>> retList = new ArrayList<>();
        queryWrapper.lambda().eq(SysModule::getType, 1);
        list(queryWrapper).forEach((t) -> {
            OptionVO<Integer> optionVO = new OptionVO<>();
            optionVO.setValue(t.getId());
            optionVO.setLabel(t.getModuleName());
            retList.add(optionVO);
        });
        return retList;
    }
}
